//  /=============================================================/
//  |   Auteurs  : J.JULLIEN / R.HERLEMAN / R.CHAILAN             |
//  |   Fichier  : variable.h                                     |
//  |   Date     : 12/04/2009                                     |
//  |   Objet    : Spécification du type "t_Variable" &           |
//  |              ses fonctions associées                        |
//  /=============================================================/

#include <stdio.h>
#include <stdlib.h>

#include "litteral.h"

/* ------------------------------------------------------------------------ */
/* ---------------------- Déclaration types exportés ---------------------- */
/* ------------------------------------------------------------------------ */

typedef struct t_Variable {
  int numVariable;
  int val;                        // 0:falsifie, 1:satisfait et sinon:neutre
  
  t_Litteral *litteral;
  t_Litteral *dernierLitteral;    // pointeur de queue de la liste chaînée de
                                  // littéraux, pour insertion en fin
  
  int nbNeutres;
  int nbSatisfaits;
  int nbFalsifies;
} t_Variable;

/* ------------------------------------------------------------------------ */
/* -------------------- Déclaration fonctions exportés -------------------- */
/* ------------------------------------------------------------------------ */

/*----------------------------------------------------------------------------
Nom              : variableInit
Prérequis        : num est bien un numéro de variable existant
Action           : Initialisation de tous les champs d'une variable et
                   retourne la variable initialisée à une valeur neutre et son
                   numéro numVariable initialisé à num
Type de retour   : t_Variable
Variable(s)      :  
  E   int   num - Numéro de la variable
----------------------------------------------------------------------------*/
t_Variable variableInit (int num);

/*----------------------------------------------------------------------------
Nom              : variableMAJCompteurs
Prérequis        : v != NULL
Action           : Met à jour les compteurs la variable v
Type de retour   : -
Variable(s)      :  
  E/S t_Variable*   v - La variable qui doit être mise à jour
  E   t_Litteral    l - Un littéral afin de connaître la valeur du littéral
  E   int           nouvelleVal - Valeur de la variable 1 ou 0 sinon neutre
----------------------------------------------------------------------------*/
void variableMAJCompteurs (t_Variable* v, t_Litteral l, int nouvelleVal);

/*----------------------------------------------------------------------------
Nom              : variableSetValeur
Prérequis        : var != NULL
Action           : Affecte val à la variable pointée par var, sans mettre à
                   jour ses compteurs
Type de retour   : -
Variable(s)      :  
  E/S t_Variable*   var - La variable qui doit changer de valeur
  E   int           val - Valeur de la variable 1 ou 0 sinon neutre
----------------------------------------------------------------------------*/
void variableSetValeur (t_Variable *var, int val);

/*----------------------------------------------------------------------------
Nom              : variableGetValeur
Prérequis        : -
Action           : Retourne la valeur de la variable var
Type de retour   : int
Variable(s)      :  
  E   t_Variable  var - La variable dont on veut connaître la valeur
----------------------------------------------------------------------------*/
int variableGetValeur (t_Variable var);

/*----------------------------------------------------------------------------
Nom              : variableAjouterLitteral
Prérequis        : lit != NULL
Action           : Ajoute le litteral lit en fin la de liste des litteraux de
                   la variable var
Type de retour   : -
Variable(s)      :  
  E/S t_Variable   var - La variable dans laquelle il faut ajouter lit
  E   t_Litteral   lit - Le littéral à ajouter
----------------------------------------------------------------------------*/
void variableAjouterLitteral (t_Variable *var, t_Litteral *lit);

/*----------------------------------------------------------------------------
Nom              : variableGetLitteral
Prérequis        : -
Action           : Retourne un pointeur sur le premier littéral de la variable
                   (null s'il n'y en a pas)
Type de retour   : t_Litteral*
Variable(s)      :  
  E t_Variable   var - La variable dont on veut le littéral
----------------------------------------------------------------------------*/
t_Litteral* variableGetLitteral(t_Variable var);

/*----------------------------------------------------------------------------
Nom              : variableEstVide
Prérequis        : -
Action           : Retourne vrai si la variable var n'a pas de litteral faux
                   sinon
Type de retour   : int
Variable(s)      :  
  E t_Variable   var - La variable à tester
----------------------------------------------------------------------------*/
int variableEstVide (t_Variable var);

/*----------------------------------------------------------------------------
Nom              : variableAfficherDebug
Prérequis        : -
Action           : Affiche des informations détaillées sur la variable var
Type de retour   : -
Variable(s)      :  
  E t_Variable   v - La variable à afficher
----------------------------------------------------------------------------*/
void variableAfficherDebug (t_Variable v);

/*----------------------------------------------------------------------------
Nom              : variableAfficherValeur
Prérequis        : -
Action           : Affiche la valeur de la variable var
Type de retour   : -
Variable(s)      :  
  E t_Variable   v - La variable à afficher
----------------------------------------------------------------------------*/
void variableAfficherValeur (t_Variable v);
